package club.mzywucai.blog.file_system.pojo.domain;

import com.sun.mail.util.MailSSLSocketFactory;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;

/**
 * @author mzywucai
 * @Description 用户激活的时候发送邮件的工具。
 * @date 2019/2/9
 */
// @Component 不能交由Spring单例托管，并发的时候出现了邮箱发送错乱漏发等情况，自己new 使用多例 ...
@Data // application.properties文件可以忽略 @PropertySource
// @PropertySource(value={"classpath:config/application.properties"}, encoding = "UTF-8")
public class SendMail {
    /**
     * @Description MZY记坑：这里是springboot 2.1.2版本，我新建的properties文件默认的编码是utf8的，但是
     * springboot读取的时候，无论是否按照网上的提醒加上@PropertySource(value={"classpath:config/resource.properties", "classpath:config/application.properties"}, encoding = "UTF-8")
     * resource.properties文件夹读出来的都是乱码！MD- 所以这里弃用resource.properties文件，配置全部移动到application.properties中。
     * @author mzywucai
     * @time 2019-02-10
     * @see
     * @return
     * @params
     */
    @Value("${server.mail.host}")
    private String host;
    @Value("${server.mail.account}")
    private String username;
    @Value("${server.mail.password}")
    private String password;
    @Value("${server.mail.head.name}")
    private String mail_head_name;
    @Value("${server.mail.head.value}")
    private String mail_head_value;

    private String mail_to;
    @Value("${server.mail.account}")
    private String mail_from;
    @Value("${server.mail.subject}")
    private String mail_subject;
    @Value("${server.mail.content}")
    private String mail_body;
    @Value("${server.mail.sender}")
    private String personalName;


    public SendMail() {

    }

    /**
     * 此段代码用来发送普通电子邮件
     *
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     * @throws GeneralSecurityException
     */
    public void send(String mailTo, String activationLink) throws MessagingException, UnsupportedEncodingException, GeneralSecurityException {
        // 加上邮箱
        this.mail_to = mailTo;
        // 替换内容
        mail_body = mail_body.replaceAll("(email)", mailTo);
        mail_body = mail_body.replaceAll("(activation-link)", activationLink);




        Properties props = new Properties();
        Authenticator auth = new Email_Autherticator(); // 进行邮件服务器用户认证
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.put("mail.transport.protocol", "smtp");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();//ssl设置
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);
        Session session = Session.getDefaultInstance(props, auth);
        // 设置session,和邮件服务器进行通讯。
        MimeMessage message = new MimeMessage(session);
        // message.setContent("foobar, "application/x-foobar"); // 设置邮件格式
        message.setContent(mail_body , "text/html;charset=utf-8");
        message.setSubject(mail_subject); // 设置邮件主题
        //message.setText(mail_body); // 设置邮件正文
        message.setHeader(mail_head_name, mail_head_value); // 设置邮件标题

        message.setSentDate(new Date()); // 设置邮件发送日期
        Address address = new InternetAddress(mail_from, personalName);
        message.setFrom(address); // 设置邮件发送者的地址
        Address toAddress = new InternetAddress(mail_to); // 设置邮件接收方的地址
        message.addRecipient(Message.RecipientType.TO, toAddress);


        Transport.send(message); // 发送邮件
    }

    /**
     * @Description
     * @author mzywucai
     * @time 2019-02-08
     * @see
     * @return
     * @params  [host, username, password, mailto, subject, text, name, head_name, head_value]
     * host：协议，例如，smtp.qq.com
     * username：作为系统邮箱的账号 例如，mzy.wucai@foxmail.com
     * password：邮箱的密码 ...
     * mailto：发送给谁？接收者的邮箱mzywucai@outlook.com
     * subject：此次邮件的主题
     * text：此次邮件的内容
     * name：发送人的名称
     * head_name：邮头
     * head_value：邮头的值
     */
    public SendMail(String host, String username, String password,
                        String mailto, String subject, String text, String name,
                        String head_name, String head_value) {
        this.host = host;
        this.username = username;
        this.mail_from = username;
        this.password = password;
        this.mail_to = mailto;
        this.mail_subject = subject;
        this.mail_body = text;
        this.personalName = name;
        this.mail_head_name = head_name;
        this.mail_head_value = head_value;
    }

    /**
     * 此段代码用来发送普通电子邮件
     *
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     * @throws GeneralSecurityException
     */
    private void send() throws MessagingException, UnsupportedEncodingException, GeneralSecurityException {
        Properties props = new Properties();
        Authenticator auth = new Email_Autherticator(); // 进行邮件服务器用户认证
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.put("mail.transport.protocol", "smtp");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();//ssl设置
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);
        Session session = Session.getDefaultInstance(props, auth);
        // 设置session,和邮件服务器进行通讯。
        MimeMessage message = new MimeMessage(session);
        // message.setContent("foobar, "application/x-foobar"); // 设置邮件格式
        message.setContent(mail_body , "text/html;charset=utf-8");
        message.setSubject(mail_subject); // 设置邮件主题
        //message.setText(mail_body); // 设置邮件正文
        message.setHeader(mail_head_name, mail_head_value); // 设置邮件标题

        message.setSentDate(new Date()); // 设置邮件发送日期
        Address address = new InternetAddress(mail_from, personalName);
        message.setFrom(address); // 设置邮件发送者的地址
        Address toAddress = new InternetAddress(mail_to); // 设置邮件接收方的地址
        message.addRecipient(Message.RecipientType.TO, toAddress);


        Transport.send(message); // 发送邮件
    }

    /**
     * 用来进行服务器对用户的认证
     */
    public class Email_Autherticator extends Authenticator {
        public Email_Autherticator() {
            super();
        }

        public Email_Autherticator(String user, String pwd) {
            super();
            username = user;
            password = pwd;
        }

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getMail_head_name() {
        return mail_head_name;
    }

    public void setMail_head_name(String mail_head_name) {
        this.mail_head_name = mail_head_name;
    }

    public String getMail_head_value() {
        return mail_head_value;
    }

    public void setMail_head_value(String mail_head_value) {
        this.mail_head_value = mail_head_value;
    }

    public String getMail_to() {
        return mail_to;
    }

    public void setMail_to(String mail_to) {
        this.mail_to = mail_to;
    }

    public String getMail_from() {
        return mail_from;
    }

    public void setMail_from(String mail_from) {
        this.mail_from = mail_from;
    }

    public String getMail_subject() {
        return mail_subject;
    }

    public void setMail_subject(String mail_subject) {
        this.mail_subject = mail_subject;
    }

    public String getMail_body() {
        return mail_body;
    }

    public void setMail_body(String mail_body) {
        this.mail_body = mail_body;
    }

    public String getPersonalName() {
        return personalName;
    }

    public void setPersonalName(String personalName) {
        this.personalName = personalName;
    }

/*

    public static void main(String[] args) {
        MailToolTest sendEmail = new MailToolTest("smtp.qq.com",
                "mzy.wucai@foxmail.com", "password", "1344874077@qq.com",
                "主题", "邮件内容", "发送人名称", "head_name", "head_value");
        System.out.println("main");
        try {
            sendEmail.send();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
*/

}
